在4.3.0
之前的版本,swoole_event_defer
方法底层的延时事件机制,存在一些问题。
- 在
Reactor::wait
之前创建的defer
任务,没有事件发生时无法触发,为了解决此问题,底层会在这种情况下,将延时任务转换为1ms
的定时器 - 在延时任务中添加延时任务,会在循环执行,而不是在下一次
epoll_wait
后执行 - 延时任务无法阻挡
Reactor
退出,导致某些延时任务可能会丢失
新版本改进了延时任务机制,现在更安全,代码更简洁。
- 有延时任务时,将
epoll_wait
的超时事件设置为0
,即使没有任何事件触发,依然可以立即去执行延时任务,而不依赖定时器 - 有延时任务时,
Reactor
必须要全部执行完成后才会退出 - 在延时任务中添加延时任务,将会在下一次
epoll_wait
后执行